import { Widget, Utils, Service } from "../../imports.js";
import Bluetooth from "resource:///com/github/Aylur/ags/service/bluetooth.js";
import Network from "resource:///com/github/Aylur/ags/service/network.js";
const { execAsync, exec } = Utils;
import { BluetoothIndicator, NetworkIndicator } from "../../lib/statusicons.js";
import { setupCursorHover } from "../../lib/cursorhover.js";
import { MaterialIcon } from "../../lib/materialicon.js";

export const ToggleIconWifi = (props = {}) =>
  Widget.Button({
    className: "txt-small sidebar-iconbutton",
    tooltipText: "Wifi | Right-click to configure",
    onClicked: Network.toggleWifi,
    onSecondaryClickRelease: () => {
      execAsync([
        "bash",
        "-c",
        //'XDG_CURRENT_DESKTOP="kde" plasma-open-settings kcm_networkmanagement',
        "~/.local/bin/rofi-wifi-menu.sh",
        "&",
      ]);
    },
    child: NetworkIndicator(),
    connections: [
      [
        Network,
        (button) => {
          button.toggleClassName(
            "sidebar-button-active",
            Network.wifi?.internet == "connected" ||
              Network.wired?.internet == "connected",
          );
        },
      ],
      [
        Network,
        (button) => {
          button.tooltipText =
            `${Network.wifi?.ssid} | Right-click to configure` || "Unknown";
        },
      ],
    ],
    setup: (button) => setupCursorHover(button),
    ...props,
  });

export const ToggleIconBluetooth = (props = {}) =>
  Widget.Button({
    className: "txt-small sidebar-iconbutton",
    tooltipText: "Bluetooth | Right-click to configure",
    onClicked: () => {
      // Provided service doesn't work hmmm
      const status = Bluetooth?.enabled;
      if (status) {
        exec("rfkill block bluetooth");
      } else {
        exec("rfkill unblock bluetooth");
      }
    },
    onSecondaryClickRelease: () => {
      execAsync([
        "bash",
        "-c",
        //'XDG_CURRENT_DESKTOP="gnome" plasma-open-settings kcm_bluetooth',
        "~/.local/bin/rofi-bluetooth.sh",
        "&",
      ]);
    },
    child: BluetoothIndicator(),
    connections: [
      [
        Bluetooth,
        (button) => {
          button.toggleClassName("sidebar-button-active", Bluetooth?.enabled);
        },
      ],
    ],
    setup: (button) => setupCursorHover(button),
    ...props,
  });

export const HyprToggleIcon = (icon, name, hyprlandConfigValue, props = {}) =>
  Widget.Button({
    className: "txt-small sidebar-iconbutton",
    tooltipText: `${name}`,
    onClicked: (button) => {
      // Set the value to 1 - value
      Utils.execAsync(`hyprctl -j getoption ${hyprlandConfigValue}`)
        .then((result) => {
          const currentOption = JSON.parse(result).int;
          execAsync([
            "bash",
            "-c",
            `hyprctl keyword ${hyprlandConfigValue} ${1 - currentOption} &`,
          ]).catch(print);
          button.toggleClassName("sidebar-button-active", currentOption == 0);
        })
        .catch(print);
    },
    child: MaterialIcon(icon, "norm", { hpack: "center" }),
    setup: (button) => {
      button.toggleClassName(
        "sidebar-button-active",
        JSON.parse(Utils.exec(`hyprctl -j getoption ${hyprlandConfigValue}`))
          .int == 1,
      );
      setupCursorHover(button);
    },
    ...props,
  });

export const ModuleNightLight = (props = {}) =>
  Widget.Button({
    className: "txt-small sidebar-iconbutton",
    tooltipText: "Night Light",
    onClicked: (button) => {
      // Set the value to 1 - value
      const shaderPath = JSON.parse(
        exec("hyprctl -j getoption decoration:screen_shader"),
      ).str;
      if (shaderPath != "[[EMPTY]]" && shaderPath != "") {
        execAsync([
          "bash",
          "-c",
          `hyprctl keyword decoration:screen_shader ''`,
        ]).catch(print);
        button.toggleClassName("sidebar-button-active", false);
      } else {
        execAsync([
          "bash",
          "-c",
          `hyprctl keyword decoration:screen_shader ~/.config/hypr/shaders/extradark.frag`,
        ]).catch(print);
        button.toggleClassName("sidebar-button-active", true);
      }
    },
    child: MaterialIcon("nightlight", "norm"),
    setup: (button) => setupCursorHover(button),
    ...props,
  });

export const ModuleEditIcon = (props = {}) =>
  Widget.Button({
    // TODO: Make this work
    ...props,
    className: "txt-small sidebar-iconbutton",
    onClicked: () => {
      execAsync([
        "bash",
        "-c",
        //'XDG_CURRENT_DESKTOP="gnome" gnome-control-center',
        'XDG_CURRENT_DESKTOP="kde" plasma-open-settings',
        "&",
      ]);
      App.toggleWindow("sideright");
    },
    child: MaterialIcon("edit", "norm"),
    setup: (button) => {
      setupCursorHover(button);
    },
  });

export const ModuleReloadIcon = (props = {}) =>
  Widget.Button({
    ...props,
    className: "txt-small sidebar-iconbutton",
    tooltipText: "Reload Hyprland",
    onClicked: () => {
      execAsync(["bash", "-c", "hyprctl reload &"]);
      App.toggleWindow("sideright");
    },
    child: MaterialIcon("refresh", "norm"),
    setup: (button) => {
      setupCursorHover(button);
    },
  });

export const ModuleSettingsIcon = (props = {}) =>
  Widget.Button({
    ...props,
    className: "txt-small sidebar-iconbutton",
    tooltipText: "Open Settings",
    onClicked: () => {
      execAsync([
        "bash",
        "-c",
        'XDG_CURRENT_DESKTOP="kde" plasma-open-settings',
        "&",
      ]);
      App.toggleWindow("sideright");
    },
    child: MaterialIcon("settings", "norm"),
    setup: (button) => {
      setupCursorHover(button);
    },
  });

export const ModulePowerIcon = (props = {}) =>
  Widget.Button({
    ...props,
    className: "txt-small sidebar-iconbutton",
    tooltipText: "Session",
    onClicked: () => {
      App.toggleWindow("session");
      App.closeWindow("sideright");
    },
    child: MaterialIcon("power_settings_new", "norm"),
    setup: (button) => {
      setupCursorHover(button);
    },
  });
